#include<iostream>
#include"httplib.h"


//调用此函数 服务端就会把客户端发来的数据解析，把解析的客户端发来的协议版本等信息 和调用set_content函数加入的数据和设置的状态码封装成一个响应报文返回给客户端
void Hello(const httplib::Request& req,httplib::Response& rsp) 
{
    rsp.set_content("hello world!","text/plain"); //设置响应的正文
    rsp.status = 200; //设置响应状态码
}

void Numbers(const httplib::Request& req,httplib::Response& rsp)
{
    auto num = req.matches[1]; //matches[0]保存的是整体路径，往后下标保存的是捕捉的数据
    rsp.set_content(num,"text/plain");
    rsp.status = 200;
}

void Multipart(const httplib::Request& req,httplib::Response& rsp)
{
    auto ret = req.has_file("file");
    if(ret == false)
    {
        std::cout << "not file" << std::endl;
        rsp.status = 404; //没找到
        return;
    }

    auto file = req.get_file_value("file"); //file是Multi
    rsp.body.clear();
    rsp.body = file.filename; //文件名称
    rsp.body += "\n";
    rsp.body += file.content; //文件内容

    rsp.set_header("Content-Type","text/plain");
    rsp.status = 200;
    return;
}

int main()
{
    httplib::Server server; //实例化Server类的对象用于搭建服务器
    server.Get("/hi",Hello); //实现一个针对/hi的Get请求的处理函数映射关系，把Hello函数指针加到Handlers请求和函数指针的映射表中
    server.Get("/numbers/(\\d+)",Numbers); /*两个反斜杠是因为\b会被认为是转义字符所以多加一个\  \b是匹配一个[0,9]之间的数字字符  +是匹配前面的字表达式一次或多次 括号就是捕捉， 意思就是匹配以/numbers/开头后面跟数字字符的一串字符串。
                                            内容会被放到req的matches中*/
    
    server.Post("/multipart",Multipart);
    std::cout << "severing...." << std::endl;
    server.listen("0.0.0.0",8080); //监听IP为0.0.0.0端口号为8080的收到的
    return 0;
}